/**
 * 微信JS-SDK相关封装
 * 调用前，必须在HTML页面中引用微信JS-SDK文件
 */
import {getWxJsSign,jsPay,getFlowStatus} from './api' // 导入微信相关接口
import {loadingToast} from '../../common/weui/weui' // 导入微信toast样式
import { setCookie, getCookie } from './utils'
window.getFlowStatus =getFlowStatus
// 保存获取环境变量，用于判断微信js-sdk配置是否打开debug
const dev = process.env.NODE_ENV === 'development'
/**
 * 微信Js-Sdk API配置封装
 * @param {Array} jsApiList 要使用的API列表 
 * @param {Function} backFuc 配置成功后的回调
 */
function wxConfig (jsApiList,backFuc) {
  if (wx.configed && wx.configed.toString().indexOf(jsApiList.toString())>=0){
    // 如果当前页面已经调用过wx.config,并且要配置的API未改变
    // 直接调用回调
    backFuc()
  } else {
    // 添加configed属性，用以保存配置结果
    if (!wx.configed) window.configed = wx.configed = []
    wx.configed.push(...jsApiList)  // 保存已经配置接口   

    if (wx.configData) {
      // 已经获取过配置信息，直接进行配置
      doWxConfig(jsApiList,backFuc,wx.configData)
    } else {
      // 未获取过配置信息，调用获取js-sdk配置信息接口，获取配置参数
      getWxJsSign({url:location.href.split('#')[0]})
        .then(data=>{
          wx.configData = data
          doWxConfig(jsApiList,backFuc,data)
        }) 
    }

  }
}
/**
 * 进行微信配置
 *
 * @param {Array} jsApiList 接口列表
 * @param {function} backFuc 回调函数
 * @param {Object} config 配置参数
 */
function doWxConfig (jsApiList,backFuc,config) {
  // 设置微信js-sdk配置信息
  wx.config(Object.assign({
    debug:false, // 是否开户debug
    jsApiList:wx.configed.concat(jsApiList), // 设置要使用的API列表
  },config))
  wx.ready(()=>{        
    // 配置完成   
    backFuc() // 调用回调
  })
}

/**
 * 微信扫码操作封装
 */
function scanCode() {  
  // 调用微信扫码API
  loadingToast() // 显示加载中toast
 

  wx.scanQRCode({  
    needResult: 1,  // 自行处理扫码结果
    scanType: [ 'qrCode', 'barCode' ],  // 扫码方式
    success: function(res) {  // 扫码成功
      setCookie('washCompleted','false')
      if (res.resultStr === getCookie('resultStr')) {

        
        setCookie('resultStr',res.resultStr)
        // 如果扫码和上次扫码结果相同
        // 先判断是否已经处于洗车流程当中
        getFlowStatus({})
          .then((data)=>{
            if (data.status === -1 || data.status === 11) {
            // 洗车已经结束或未处于洗车流程之中
              location.href = 'wash.html'
            } else {
            // 处于洗车中，直接带状态码跳转到洗车页面
              location.href = `wash.html?status=${data.status}&a=${data.price}`
            }
          })
          .catch(()=>{
            loadingToast({hide:true}) // 隐藏加载中toast
          }) 
      } else {
        
        setCookie('resultStr',res.resultStr)
        location.href = 'wash.html'
      }
      // alert(res.resultStr)
      
    },  
    fail: function(res) {   // 扫码失败
      alert('fail' + JSON.stringify(res))
    },
    cancel: function() {
      loadingToast({hide:true})  
    },
  })
   
} 

/**
 * 绑定扫码事件
 * @param {DOM} element 绑定调用扫码事件的按钮 
 */
export function bindScan (element) {
  wxConfig(['scanQRCode'],()=>{
    element.addEventListener('click',scanCode)
  })
}
/**
 * 微信支付
 * @param {Object} opts
 * {
 *    finalmoney:10, // 洗车或充值金额
 *    type: 1 // 业务类型：1：洗车 2：充值
 * } 
 */
export function wxPay (opts) {
  // 开发环境用于测试，所有金额默认为0.01
  dev && (opts.payInfo.finalmoney = 0.01)
  // 进行js-sdk配置
  wxConfig(['chooseWXPay'],()=>{
    // 调用获取微信支付订单
    jsPay(opts.payInfo)
      .then(data=>{   
        // 发起支付，调用微信js-sdk支付接口       
        wx.chooseWXPay(Object.assign({},data,opts))
      })
      .catch(err=>{
        // 获取微信支付订单失败
        opts.fail && typeof opts.fail === 'function' && opts.fail(err)
      })
  })
  
}
/**
 *
 * 导出微信获取位置方法
 * @export function
 * @param {Object} opts 参数
 */
export function wxLocation (opts) {
  wxConfig(['getLocation'],()=>{
    wx.getLocation(Object.assign({
      type:'wgs84',
    },opts))
  })
}